package com.maidou.qiantai.api;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectResult;
import com.maidou.qiantai.config.OssMessageConfig;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.uuid.UUID;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.ArrayList;

/**
 * @Author zzww
 * @Date 2022/12/9 21:10
 */
@Service
public class OssServiceApi {

    @Resource
    private OssMessageConfig ossMessageConfig;

    /**
     * 删除单个文件
     */
    public boolean deleteFile(String fileName) {
        /**
         * 工具类获取值
         */
        // yourEndpoint填写Bucket所在地域对应的Endpoint。
        // 以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        String endpoint = ossMessageConfig.getEndpoint();
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = ossMessageConfig.getAccessKeyId();
        String accessKeySecret = ossMessageConfig.getAccessKeySecret();
        // 填写Bucket名称，例如examplebucket
        String bucketName = ossMessageConfig.getBucketName();
        /**
         * 填写文件名。文件名包含路径，不包含Bucket名称。
         * 例如2021/09/14/52c6a3114e634979a2934f1ea12deaadfile.png。
         *
         * https://qing-gulimall-upload.oss-cn-fuzhou.aliyuncs.com/2022/12/f0c9c666-1e77-4701-813d-3309725d6101_src=http___pic1.zhimg.com_v2-8ab8272484ecbc6a1b889dae03af4c28_r.jpg&refer=http___pic1.zhimg.webp
         */
        String objectName = fileName;
        String[] split = objectName.split("aliyuncs.com/");
        objectName = split[1];

//        boolean flag = false;
        try {
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            // 删除文件。
            ossClient.deleteObject(bucketName, objectName);
//            if (voidResult.getResponse().getStatusCode() == 204){
//                flag = true;
//            }
            // 关闭OSSClient。
            ossClient.shutdown();

        } catch (OSSException e){
            e.printStackTrace();
            return false;
        }
        return true;
    }


    /**
     * 文件上传
     * @return
     */
    public String OssUpload(MultipartFile multipartFile, String bucketName) {
        if (ObjectUtils.isEmpty(multipartFile)){
            return null;
        }
        String filename = multipartFile.getOriginalFilename();
        if (ObjectUtils.isEmpty(filename)){
            return null;
        }
        if (ObjectUtils.isEmpty(bucketName)){
            bucketName = ossMessageConfig.getBucketName();
        }
        ArrayList<Object> objects = new ArrayList<>();
        //获取文件后缀
        String substring = filename.substring(filename.lastIndexOf("."));
        //拼接发送的地址
        //目录结构   年/月/日/uuid+时间搓+文件后缀名
        String objectName = DateUtils.datePath()+"/"+
                UUID.randomUUID().toString().trim().replaceAll("-", "") +
                System.currentTimeMillis()+substring;
        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        OSS ossClient = null;
        // 创建OSSClient实例。

        try {
            InputStream inputStream = multipartFile.getInputStream();
            ossClient = new OSSClientBuilder().build(ossMessageConfig.getEndpoint(),
                    ossMessageConfig.getAccessKeyId(),ossMessageConfig.getAccessKeySecret());
//            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(bucketName, objectName, inputStream);
//https://crowd-photo-upload.oss-cn-fuzhou.aliyuncs.com/crowd-upload/details/061faf0b5ccc4fa18f739db6fd9894631659717415.jpg
            String urlFile = "https://"+bucketName+"."+ossMessageConfig.getEndpoint()+"/"+objectName;
            return urlFile;
        }catch (Exception ce) {
            return null;
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
